home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / OldSrc / CH10 / SRC / HILO.FRM < prev    next >
Text File  |  1996-05-02  |  17KB  |  634 lines

  1. VERSION 4.00
  2. Begin VB.Form HiLoForm 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H00C0C0C0&
  5.    Caption         =   "Hi-Lo"
  6.    ClientHeight    =   5700
  7.    ClientLeft      =   300
  8.    ClientTop       =   855
  9.    ClientWidth     =   9090
  10.    BeginProperty Font 
  11.       name            =   "MS Sans Serif"
  12.       charset         =   1
  13.       weight          =   700
  14.       size            =   8.25
  15.       underline       =   0   'False
  16.       italic          =   0   'False
  17.       strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    Height          =   6390
  21.    KeyPreview      =   -1  'True
  22.    Left            =   240
  23.    LinkTopic       =   "Form1"
  24.    ScaleHeight     =   5700
  25.    ScaleWidth      =   9090
  26.    Top             =   225
  27.    Width           =   9210
  28.    Begin VB.OptionButton Choice 
  29.       Caption         =   "Sombrero"
  30.       Height          =   255
  31.       Index           =   9
  32.       Left            =   7080
  33.       TabIndex        =   18
  34.       Top             =   3240
  35.       Width           =   2055
  36.    End
  37.    Begin VB.CheckBox ShowHiddenCheck 
  38.       Caption         =   "Show Hidden Surfaces"
  39.       Height          =   495
  40.       Left            =   7080
  41.       TabIndex        =   17
  42.       Top             =   4440
  43.       Width           =   2055
  44.    End
  45.    Begin VB.CheckBox ShowAxesCheck 
  46.       Caption         =   "Show Axes"
  47.       Height          =   255
  48.       Left            =   7080
  49.       TabIndex        =   16
  50.       Top             =   4080
  51.       Width           =   2055
  52.    End
  53.    Begin VB.OptionButton Choice 
  54.       Caption         =   "Saddle"
  55.       Height          =   255
  56.       Index           =   8
  57.       Left            =   7080
  58.       TabIndex        =   15
  59.       Top             =   2880
  60.       Width           =   2055
  61.    End
  62.    Begin VB.OptionButton Choice 
  63.       Caption         =   "Cone"
  64.       Height          =   255
  65.       Index           =   7
  66.       Left            =   7080
  67.       TabIndex        =   14
  68.       Top             =   2520
  69.       Width           =   2055
  70.    End
  71.    Begin VB.OptionButton Choice 
  72.       Caption         =   "Holes"
  73.       Height          =   255
  74.       Index           =   6
  75.       Left            =   7080
  76.       TabIndex        =   13
  77.       Top             =   2160
  78.       Width           =   2055
  79.    End
  80.    Begin VB.TextBox PhiText 
  81.       Height          =   285
  82.       Left            =   3600
  83.       TabIndex        =   12
  84.       Text            =   "0.1570"
  85.       Top             =   5400
  86.       Width           =   855
  87.    End
  88.    Begin VB.TextBox ThetaText 
  89.       Height          =   285
  90.       Left            =   2040
  91.       TabIndex        =   10
  92.       Text            =   "0.6283"
  93.       Top             =   5400
  94.       Width           =   855
  95.    End
  96.    Begin VB.TextBox RText 
  97.       Height          =   285
  98.       Left            =   480
  99.       TabIndex        =   8
  100.       Text            =   "10"
  101.       Top             =   5400
  102.       Width           =   855
  103.    End
  104.    Begin VB.OptionButton Choice 
  105.       Caption         =   "Hemisphere"
  106.       Height          =   255
  107.       Index           =   5
  108.       Left            =   7080
  109.       TabIndex        =   7
  110.       Top             =   1800
  111.       Width           =   2055
  112.    End
  113.    Begin VB.OptionButton Choice 
  114.       Caption         =   "Randomized Ridges"
  115.       Height          =   255
  116.       Index           =   4
  117.       Left            =   7080
  118.       TabIndex        =   6
  119.       Top             =   1440
  120.       Width           =   2055
  121.    End
  122.    Begin VB.OptionButton Choice 
  123.       Caption         =   "Ridges"
  124.       Height          =   255
  125.       Index           =   3
  126.       Left            =   7080
  127.       TabIndex        =   5
  128.       Top             =   1080
  129.       Width           =   2055
  130.    End
  131.    Begin VB.OptionButton Choice 
  132.       Caption         =   "Bowl"
  133.       Height          =   255
  134.       Index           =   2
  135.       Left            =   7080
  136.       TabIndex        =   4
  137.       Top             =   720
  138.       Width           =   2055
  139.    End
  140.    Begin VB.OptionButton Choice 
  141.       Caption         =   "Mounds"
  142.       Height          =   255
  143.       Index           =   1
  144.       Left            =   7080
  145.       TabIndex        =   3
  146.       Top             =   360
  147.       Width           =   2055
  148.    End
  149.    Begin VB.OptionButton Choice 
  150.       Caption         =   "Splash"
  151.       Height          =   255
  152.       Index           =   0
  153.       Left            =   7080
  154.       TabIndex        =   2
  155.       Top             =   0
  156.       Value           =   -1  'True
  157.       Width           =   2055
  158.    End
  159.    Begin VB.PictureBox Pict 
  160.       AutoRedraw      =   -1  'True
  161.       Height          =   5295
  162.       Left            =   0
  163.       ScaleHeight     =   349
  164.       ScaleMode       =   3  'Pixel
  165.       ScaleWidth      =   461
  166.       TabIndex        =   0
  167.       Top             =   0
  168.       Width           =   6975
  169.    End
  170.    Begin MSComDlg.CommonDialog LoadDialog 
  171.       Left            =   7080
  172.       Top             =   5040
  173.       _version        =   65536
  174.       _extentx        =   847
  175.       _extenty        =   847
  176.       _stockprops     =   0
  177.       cancelerror     =   -1  'True
  178.    End
  179.    Begin VB.Label Label1 
  180.       Caption         =   "Phi"
  181.       Height          =   255
  182.       Index           =   2
  183.       Left            =   3240
  184.       TabIndex        =   11
  185.       Top             =   5400
  186.       Width           =   375
  187.    End
  188.    Begin VB.Label Label1 
  189.       Caption         =   "Theta"
  190.       Height          =   255
  191.       Index           =   1
  192.       Left            =   1440
  193.       TabIndex        =   9
  194.       Top             =   5400
  195.       Width           =   495
  196.    End
  197.    Begin VB.Label Label1 
  198.       Caption         =   "R"
  199.       Height          =   255
  200.       Index           =   0
  201.       Left            =   240
  202.       TabIndex        =   1
  203.       Top             =   5400
  204.       Width           =   255
  205.    End
  206.    Begin VB.Menu mnuFile 
  207.       Caption         =   "&File"
  208.       Begin VB.Menu mnuFileLoad 
  209.          Caption         =   "&Load..."
  210.          Shortcut        =   ^L
  211.       End
  212.       Begin VB.Menu mnuFileSaveAs 
  213.          Caption         =   "&Save As..."
  214.          Shortcut        =   ^A
  215.       End
  216.       Begin VB.Menu mnuFileSep 
  217.          Caption         =   "-"
  218.       End
  219.       Begin VB.Menu mnuFileExit 
  220.          Caption         =   "E&xit"
  221.       End
  222.    End
  223. End
  224. Attribute VB_Name = "HiLoForm"
  225. Attribute VB_Creatable = False
  226. Attribute VB_Exposed = False
  227. Option Explicit
  228.  
  229. ' Location of viewing eye.
  230. Dim EyeR As Single
  231. Dim EyeTheta As Single
  232. Dim EyePhi As Single
  233.  
  234. Const Dtheta = PI / 20
  235. Const Dphi = PI / 20
  236. Const Dr = 1
  237.  
  238. ' Location of focus point.
  239. Const FocusX = 0#
  240. Const FocusY = 0#
  241. Const FocusZ = 0#
  242.  
  243. Dim Projector(1 To 4, 1 To 4) As Single
  244.  
  245. Dim ThePicture As ObjPicture
  246. Dim TheGrid As ObjGrid3D
  247.  
  248. Dim ShowingParameters As Boolean
  249.  
  250. Dim ChoiceNum As Integer
  251.  
  252.  
  253. ' *******************************************************
  254. ' Draw the surface.
  255. ' *******************************************************
  256. Private Sub DrawData(pic As Object)
  257. Dim x As Single
  258. Dim y As Single
  259. Dim z As Single
  260. Dim S(1 To 4, 1 To 4) As Single
  261. Dim t(1 To 4, 1 To 4) As Single
  262. Dim ST(1 To 4, 1 To 4) As Single
  263. Dim PST(1 To 4, 1 To 4) As Single
  264.  
  265.     MousePointer = vbHourglass
  266.     Refresh
  267.     
  268.     ' Prevent overflow errors when drawing lines
  269.     ' too far out of bounds.
  270.     On Error Resume Next
  271.     
  272.     ' Scale and translate so it looks OK in pixels.
  273.     m3Scale S, 35, -35, 1
  274.     m3Translate t, 230, 175, 0
  275.     m3MatMultiplyFull ST, S, t
  276.     m3MatMultiplyFull PST, Projector, ST
  277.     
  278.     ' Transform the points.
  279.     ThePicture.ApplyFull PST
  280.  
  281.     ' Display the data.
  282.     pic.Cls
  283.     ThePicture.Draw pic, EyeR
  284.     pic.Refresh
  285.  
  286.     ' Display the viewing parameters.
  287.     ShowViewingParameters
  288.  
  289.     MousePointer = vbDefault
  290. End Sub
  291.  
  292. Sub ShowViewingParameters()
  293.     ShowingParameters = True
  294.     
  295.     RText.Text = Format$(EyeR, "0.0000")
  296.     ThetaText.Text = Format$(EyeTheta, "0.0000")
  297.     PhiText.Text = Format$(EyePhi, "0.0000")
  298.     
  299.     RText.Refresh
  300.     ThetaText.Refresh
  301.     PhiText.Refresh
  302.  
  303.     ShowingParameters = False
  304. End Sub
  305.  
  306. Private Sub Choice_Click(Index As Integer)
  307.     ChoiceNum = Index
  308.     CreateData (ShowAxesCheck.value = vbChecked)
  309.     DrawData Pict
  310.     Pict.SetFocus
  311. End Sub
  312.  
  313. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  314.     Select Case KeyCode
  315.         Case vbKeyLeft
  316.             EyeTheta = EyeTheta - Dtheta
  317.         
  318.         Case vbKeyRight
  319.             EyeTheta = EyeTheta + Dtheta
  320.         
  321.         Case vbKeyUp
  322.             EyePhi = EyePhi - Dphi
  323.         
  324.         Case vbKeyDown
  325.             EyePhi = EyePhi + Dphi
  326.                 
  327.         Case Else
  328.             Exit Sub
  329.     End Select
  330.  
  331.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  332.     DrawData Pict
  333. End Sub
  334.  
  335.  
  336. Private Sub Form_KeyPress(KeyAscii As Integer)
  337.     Select Case KeyAscii
  338.         Case Asc("+")
  339.             EyeR = EyeR + Dr
  340.         
  341.         Case Asc("-")
  342.             EyeR = EyeR - Dr
  343.         
  344.         Case Else
  345.             Exit Sub
  346.     End Select
  347.  
  348.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  349.     DrawData Pict
  350. End Sub
  351.  
  352. Private Sub Form_Load()
  353.     ' Initialize the eye position.
  354.     EyeR = 10
  355.     EyeTheta = PI * 0.2
  356.     EyePhi = PI * 0.1
  357.     
  358.     ' Initialize the projection transformation.
  359.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  360.     
  361.     ' Create the data.
  362.     CreateData (ShowAxesCheck.value = vbChecked)
  363.  
  364.     ' Project and draw the data.
  365.     Me.Show
  366.     DrawData Pict
  367. End Sub
  368.  
  369. ' ************************************************
  370. ' Create the surface.
  371. ' ************************************************
  372. Sub CreateData(show_axes As Boolean)
  373. Const xmin = -5
  374. Const Zmin = -5
  375. Const dx = 0.3
  376. Const dz = 0.3
  377. Const NumX = -2 * xmin / dx
  378. Const NumZ = -2 * Zmin / dz
  379. Const Amp = 0.25
  380. Const Per = 2 * PI / 4
  381. Const Amp2 = 1
  382. Const Per2 = 2 * PI / 16
  383. Const Amp3 = 2
  384.  
  385. Dim axis As ObjPolyline
  386. Dim i As Integer
  387. Dim j As Integer
  388. Dim x As Single
  389. Dim y As Single
  390. Dim z As Single
  391. Dim D As Single
  392. Dim R2 As Single
  393. Dim x1 As Single
  394. Dim z1 As Single
  395. Dim x2 As Single
  396. Dim z2 As Single
  397.  
  398.     MousePointer = vbHourglass
  399.     Refresh
  400.     
  401.     Set ThePicture = New ObjPicture
  402.     Set TheGrid = New ObjGrid3D
  403.     TheGrid.SetBounds xmin, dx, NumX, Zmin, dz, NumZ
  404.     ThePicture.objects.Add TheGrid
  405.     TheGrid.ShowHidden = (ShowHiddenCheck.value = vbChecked)
  406.     
  407.     If show_axes Then
  408.         Set axis = New ObjPolyline
  409.         ThePicture.objects.Add axis
  410.         axis.AddSegment 0, 0, 0, 5.5, 0, 0
  411.         axis.AddSegment 0, 0, 0, 0, 3, 0
  412.         axis.AddSegment 0, 0, 0, 0, 0, 5.5
  413.     End If
  414.  
  415.     R2 = (xmin + 3 * dx) * (xmin + 3 * dx)
  416.     x = xmin
  417.     For i = 1 To NumX
  418.         z = Zmin
  419.         For j = 1 To NumZ
  420.             Select Case ChoiceNum
  421.                 Case 0  ' Splash.
  422.                     D = Sqr(x * x + z * z)
  423.                     y = Amp * Cos(3 * D)
  424.  
  425.                 Case 1  ' Mounds.
  426.                     y = Amp * (Cos(Per * x) + Cos(Per * z))
  427.                 
  428.                 Case 2  ' Bowl.
  429.                     y = 0.2 * (x * x + z * z) - 5#
  430.                 
  431.                 Case 3  ' Ridges.
  432.                     y = Amp2 * Cos(Per2 * x) + Amp3 * Cos(Per * z) / (Abs(z) / 3 + 1)
  433.             
  434.                 Case 4  ' Random ridges.
  435.                     y = Amp2 * Cos(Per2 * x) + Amp3 * Cos(Per * z) / (Abs(z) / 3 + 1) + Amp * Rnd
  436.             
  437.                 Case 5  ' Hemisphere.
  438.                     D = x * x + z * z
  439.                     If D >= R2 Then
  440.                         y = 0
  441.                     Else
  442.                         y = Sqr(R2 - D)
  443.                     End If
  444.                 
  445.                 Case 6  ' Holes.
  446.                     x1 = (x + xmin / 2)
  447.                     z1 = (z + xmin / 2)
  448.                     x2 = (x - xmin / 2)
  449.                     z2 = (z - xmin / 2)
  450.                     y = Amp3 - _
  451.                 1 / (x1 * x1 + z1 * z1 + 0.1) - _
  452.                 1 / (x2 * x2 + z1 * z1 + 0.1) - _
  453.                 1 / (x1 * x1 + z2 * z2 + 0.1) - _
  454.                 1 / (x2 * x2 + z2 * z2 + 0.1)
  455.             
  456.                 Case 7  ' Cone.
  457.                     D = 2 * (Amp3 - Sqr(x * x + z * z))
  458.                     If D < -Amp3 Then D = -Amp3
  459.                     y = D
  460.             
  461.                 Case 8  ' Saddle.
  462.                     y = (x * x - z * z) / 10
  463.                 
  464.                 Case 9  ' Sombrero.
  465.                     D = Sqr(x * x + z * z)
  466.                     If D < 1 Then
  467.                         R2 = 10
  468.                     Else
  469.                         R2 = 10 / D
  470.                     End If
  471.                     y = R2 * Amp * Cos(1.5 * D)
  472.  
  473.             End Select
  474.             
  475.             TheGrid.SetValue x, y, z
  476.             z = z + dz
  477.         Next j
  478.         x = x + dx
  479.     Next i
  480.     
  481.     MousePointer = vbDefault
  482. End Sub
  483.  
  484. Private Sub mnuFileExit_Click()
  485.     Unload Me
  486. End Sub
  487.  
  488.  
  489. Private Sub mnuFileLoad_Click()
  490. Dim fname As String
  491. Dim filenum As Integer
  492. Dim txt As String
  493. Dim xmin As Single
  494. Dim ymin As Single
  495. Dim xmax As Single
  496. Dim ymax As Single
  497.  
  498.     ' Allow the user to pick a file.
  499.     On Error Resume Next
  500.     LoadDialog.filename = "*.APF"
  501.     LoadDialog.ShowOpen
  502.     If Err.Number = cdlCancel Then
  503.         Unload LoadDialog
  504.         Exit Sub
  505.     ElseIf Err.Number <> 0 Then
  506.         Unload LoadDialog
  507.         Beep
  508.         MsgBox "Error selecting file.", , vbExclamation
  509.         Exit Sub
  510.     End If
  511.     On Error GoTo 0
  512.     
  513.     fname = LoadDialog.filename
  514.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  515.         - Len(LoadDialog.FileTitle) - 1)
  516.  
  517.     ' Clear the picture.
  518.     Set ThePicture = Nothing
  519.     
  520.     ' Open the file.
  521.     filenum = FreeFile
  522.     Open fname For Input As #filenum
  523.     
  524.     ' Make sure it's an Object Picture File.
  525.     Input #filenum, txt
  526.     If txt <> "3D APF PICTURE" Then
  527.         Close filenum
  528.         Beep
  529.         MsgBox "Error reading file """ & fname & """.", , vbExclamation
  530.         Exit Sub
  531.     End If
  532.  
  533.     ' Read the picture.
  534.     MousePointer = vbHourglass
  535.     DoEvents
  536.     Set ThePicture = New ObjPicture
  537.     ThePicture.FileInput filenum
  538.     
  539.     ' Close the file.
  540.     Close filenum
  541.     
  542.     If ThePicture.objects(1).ObjectType = "GRID" Then
  543.         Set TheGrid = ThePicture.objects(1)
  544.         TheGrid.ShowHidden = (ShowHiddenCheck.value = vbChecked)
  545.     End If
  546.     
  547.     ' Refresh the display.
  548.     DrawData Pict
  549.     
  550.     ' Deselect all the option buttons.
  551.     For ChoiceNum = 0 To 9
  552.         If Choice(ChoiceNum).value Then _
  553.             Choice(ChoiceNum).value = False
  554.     Next ChoiceNum
  555.  
  556.     MousePointer = vbDefault
  557. End Sub
  558.  
  559. Private Sub mnuFileSaveAs_Click()
  560. Dim fname As String
  561. Dim filenum As Integer
  562.  
  563.     ' Allow the user to pick a file.
  564.     On Error Resume Next
  565.     LoadDialog.filename = "*.APF"
  566.     LoadDialog.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  567.     LoadDialog.ShowSave
  568.     If Err.Number = cdlCancel Then
  569.         Unload LoadDialog
  570.         Exit Sub
  571.     ElseIf Err.Number <> 0 Then
  572.         Unload LoadDialog
  573.         Beep
  574.         MsgBox "Error selecting file.", , vbExclamation
  575.         Exit Sub
  576.     End If
  577.     On Error GoTo 0
  578.     
  579.     fname = LoadDialog.filename
  580.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  581.         - Len(LoadDialog.FileTitle) - 1)
  582.     
  583.     ' Open the file.
  584.     filenum = FreeFile
  585.     Open fname For Output As #filenum
  586.     
  587.     ' Write the picture.
  588.     ThePicture.FileWrite filenum
  589.     
  590.     ' Close the file.
  591.     Close filenum
  592. End Sub
  593.  
  594.  
  595.  
  596.  
  597. Private Sub PhiText_Change()
  598.     If ShowingParameters Then Exit Sub
  599.     EyePhi = CSng(PhiText.Text)
  600.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  601.     DrawData Pict
  602. End Sub
  603.  
  604. ' ************************************************
  605. ' Turn hidden surfaces on or off.
  606. ' ************************************************
  607. Private Sub ShowHiddenCheck_Click()
  608.     TheGrid.ShowHidden = (ShowHiddenCheck.value = vbChecked)
  609.     DrawData Pict
  610.     Pict.SetFocus
  611. End Sub
  612.  
  613. Private Sub RText_Change()
  614.     If ShowingParameters Then Exit Sub
  615.     EyeR = CSng(RText.Text)
  616.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  617.     DrawData Pict
  618. End Sub
  619.  
  620.  
  621. Private Sub ShowAxesCheck_Click()
  622.     CreateData (ShowAxesCheck.value = vbChecked)
  623.     DrawData Pict
  624.     Pict.SetFocus
  625. End Sub
  626.  
  627. Private Sub ThetaText_Change()
  628.     If ShowingParameters Then Exit Sub
  629.     EyeTheta = CSng(ThetaText.Text)
  630.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  631.     DrawData Pict
  632. End Sub
  633.  
  634.